Wielkość śledzia oceanicznego (Clupea harengus) uległa zmniejszeniu. Przez ostatnie 60 lat zmierzono długość ponad 50 tysięcy złowionych śledzi oraz zarejestrowano parametry ich naturalnego ekosystemu w momencie połowu. Poniższy, interaktywny wykres prezentuje zmiany wielkości śledzi w czasie.
Ten raport pokazuje, że temperatura powierzchni oceanu jest czynnikiem najbardziej, spośród dostępnych, skorelowanym z rozmiarem śledzia. Jest to korelacja negatywna, to znaczy, że przy rosnącej temperaturze długość śledzi maleje, a przy spadku temperatury następuje wzrost wielkości tych ryb.
Śledź oceaniczny (Clupea harengus), Źródło: Wikimedia
Wniosek ten został wyciągnięty po analizie dostępnego zbioru danych. Aż 20% rekordów z tego zbioru wymagało uzupełnienia brakujących danych. Aby zmniejszyć złożoność problemu, trzy atrybuty zostały usunięte ze względu na wysoką korelację z innymi parametrami.
Sys.setlocale("LC_CTYPE","pl_PL")
set.seed(92)
library(ggplot2)
library(plotly)
library(knitr)
library(VIM)
library(lattice)
library(mice)
library(reshape2)
library(caret)
herrings <-read.csv("sledzie.csv", na.strings = "?")
Zbiór danych posiada 16 atrybutów. Na żadnym z nich nie brakuje więcej niż 5% wartości. Oznacza to, że żaden z atrybutów nie musi zostać odrzucony ani nie wymaga ponownych pomiarów.
| X | length | cfin1 | cfin2 | chel1 | chel2 | lcop1 | lcop2 | fbar | recr | cumf | totaln | sst | sal | xmonth | nao |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 % | 0 % | 3.01 % | 2.92 % | 2.96 % | 2.96 % | 3.14 % | 3.03 % | 0 % | 0 % | 0 % | 0 % | 3.01 % | 0 % | 0 % | 0 % |
Poniższy wykres pokazuje częstość występowania obserwacji o określonej kombinacji brakujących wartości. Pola puste występują na siedmiu atrybutach. Prawie 80% zbioru stanowią kompletne wiersze. Następnie, najliczniejszą grupą są rekordy w których brakuje tylko jednej wartości. Przypadki gdy w danym wierszu brakuje dwóch lub trzech wartości stanowią zdecydowaną mniejszość.
Brakujące wartości są uzupełniane techniką Multivariate Imputation by Chained Equations przy użyciu pakietu MICE.
imputedHerrings <- mice(herrings, m=1, method = "mean", seed= 29, print=FALSE)
Poniżej zaprezentowo wykresy gęstości wartości zmiennych. Oryginalne pomiary zilustrowano kolorem niebieskim; rozkład gęstości uzupełnionych danych przedstawiono na czerwono. Okazuje się, że w większości przypadków brakujące wartości pochodziły z wąskiego zakresu wartości oryginalnych pomiarów. Jest to przesłanka za tym, że wartości puste nie były przypadkowe i zaszły tylko w określonych warunkach połowu.
Następnie utworzona zostaje nowa kolekcja danych, uzupełniona o brakujące wartości.
completeHerrings <- complete(imputedHerrings, 1)
Istnieje niezerowe prawdopodobieństwo, że pomiędzy dostępnymi atrybutami istnieje korelacja. To znaczy obecność jednego atrybutu nie wnosi nowych informacji w obecności innego atrybutu. Taka nadmiarowość jest niepożądana z perspektywy planowanej regresji. Aby to sprawdzić stworzono macierz korelacji Pearsona pomiedzy każdą parą atrybutów.
Analiza macierzy pozwala usunąć trzy atrybuty: chel1 (silna korelacja z lcop1), chel2 (powiązanie z lcop2) oraz fbar (związek z cumf).
completeHerrings <- subset(completeHerrings, select = -c(chel1,chel2, fbar))
Ostatnim etapem jest nadanie nowych, czytelnych nazw kolumnom.
colnames(completeHerrings) <- c("Połów",
"Długość",
"Calanus finmarchicus gatunek 1",
"Calanus finmarchicus gatunek 2",
"Widłonogi gatunek 1",
"Widłonogi gatunek 2",
"Złowione śledzie w skali roku",
"Żywy narybek w skali roku",
"Złowione śledzie w czasie połowu",
"Temperatura powierzchni oceanu [°C]",
"Zasolenie wody [‰]",
"MiesiÄ…c",
"NAO")
Ostatecznie, zbiór danych zawiera 52582 obserwacje oraz 13 zmiennych. Rozkład wartości tych zmiennych prezentują poniższe wykresy.
Celem regresji w tym raporcie jest stworzenie modelu środowiska, który będzie przewidywał długość złowionych śledzi. W pierwszym kroku, ze zbioru danych eliminowany jest atrybut określający chronologię, a następnie zbiór jest dzielony na część treningową i testową.
regressionHerrings <- subset(completeHerrings, select = -Połów)
inTraining <- createDataPartition(y = regressionHerrings$Długość,
p = .70,
list = FALSE)
trainingHerrings <- regressionHerrings[inTraining, ]
testingHerrings <- regressionHerrings[-inTraining, ]
Proces uczenia odbywa się w ramach walidacji krzyżowej, w której zbiór treningowy dzielony jest na cztery części. Następnie określane są parametry wymagające strojenia.
ctrl <- trainControl(method = "cv", number = 4)
paramsGrid <- expand.grid(n.trees=c(200, 300, 400),
interaction.depth = 5:10,
shrinkage=c(0.1, 0.2, 0.5),
n.minobsinnode=c(5))
Regresor tworzony jest algorytmem Stochastic Gradient Boosting.
fit <- train(Długość ~ .,
data = trainingHerrings,
method = "gbm",
trControl = ctrl,
tuneGrid=paramsGrid)
Na zbiorze testowym algorytm osiąga miarę R² równą 0.52 oraz RMSE na poziomie 1.16 cm. Wyniki te pochodzą z dostrojenia parametrów do poniższych wartości:
| n.trees | interaction.depth | shrinkage | n.minobsinnode | |
|---|---|---|---|---|
| 18 | 400 | 10 | 0.1 | 5 |
Ostatnim etapem analizy jest identyfikacja tych atrybutów, które mają największe znaczenie przy przewidywaniu długości śledzia. Poniższa lista prezentuje wszystkie atrybuty wraz ze znormalizowaną miarą ich znaczenia. Zdecydowanym liderem jest tutaj temperatura na powierzchni oceanu.
## gbm variable importance
##
## Overall
## `Temperatura powierzchni oceanu [°C]` 100.0000
## `Złowione śledzie w skali roku` 28.8488
## `Widłonogi gatunek 1` 13.9047
## `Złowione śledzie w czasie połowu` 12.7210
## MiesiÄ…c 10.3952
## `Widłonogi gatunek 2` 3.6638
## `Calanus finmarchicus gatunek 2` 3.5776
## `Calanus finmarchicus gatunek 1` 2.4823
## `Żywy narybek w skali roku` 2.0326
## NAO 0.9792
## `Zasolenie wody [‰]` 0.0000
Wykres poniżej prezentuje jak bardzo zmiany w długości śledzi są skorelowane w czasie ze zmianami temperatury wody.